/**
 * @description 表单必须类型
 */

import type { Radio } from './RadioType'

type Trigger = 'blur' | 'change'

export interface Form {
  /**
   * @description input类型
   */
  inputType: string

  /**
   *@description textarea文本域 行数
   */

  /**
   *@description 最大输入长度
   *@default 10
   */
  maxlength: number

  /**
   *@description 最小输入长度
   *@default 1
   */
  minlength: number

  rows: number

  /**
   * @description lable宽度
   */
  labelWidth: number

  /**
   * @description item宽度
   */
  itemWidth: number

  /**
   * @description 插槽名
   */
  slotName: string

  /**
   * @description 提示文字
   */
  placeholder: string

  /**
   * @description 是否禁用
   */
  disabled: Boolean

  /**
   * @description 是否一键清空内容 (默认不清空)
   */
  clearable: boolean

  /**
   * @description 回调函数处理一些数据
   */
  callback: Function

  httpRequest: Function

  /**
   * @description 表单验证规则
   */
  rules: any

  radio: Radio

  /**
   * @description select配置
   */
  selectOptions: {
    /**
     * @description select 数据
     */
    data: Array<object>
    /**
     * @description 标签名
     */
    label: string
    /**
     * @description 选择值
     */
    value: string

    /**
     * @description 是否一键清空内容 (默认不清空)
     */
    clearable?: Boolean

    /**
     * @description 是否启用筛选 (默认不启用)
     */
    filterable?: Boolean
  }

  switch: {
    activeValue: number | Boolean
    inactiveValue: number | Boolean
  }

  mark?: string | number | Array<string | number | object>
}

type PagePartial<T> = {
  [P in keyof T]?: T[P]
}

export type MyForm = PagePartial<Form>

export interface MyFormConfigType<T> extends MyForm {
  label: string //标签

  prop: T //key值

  /**
   * 类型( input 输入框 , select 选择框 , file 文件上传 , date/dateTime 日期/日期时间 )
   */
  type:
    | ''
    | 'input'
    | 'numberInput'
    | 'textarea'
    | 'radio'
    | 'select'
    | 'switch'
    | 'upload'
    | 'timePicker'
    | 'datePicker'
    | 'cascader'
    | 'slot'
}

/**
 * @description 表单配置类型
 */
export interface MyFormConfig<T> {
  item: Array<MyFormConfigType<T>>
  rules: any
}
